/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.mindbox.mueblesalpes.negocio.ws;

import com.mindbox.mueblesalpes.negocio.cliente.ClienteServiceLocal;
import com.mindbox.mueblesalpes.negocio.compras.CarritoComprasLocal;
import com.mindbox.mueblesalpes.negocio.entity.Cliente;
import com.mindbox.mueblesalpes.negocio.entity.DatosTarjeta;
import com.mindbox.mueblesalpes.negocio.entity.Entidad;
import com.mindbox.mueblesalpes.negocio.entity.Mueble;
import com.mindbox.mueblesalpes.negocio.entity.Usuario;
import com.mindbox.mueblesalpes.negocio.exception.MontoTarjetaInsuficiente;
import com.mindbox.mueblesalpes.negocio.exception.NoSePudoGrabarTarjetaCredito;
import com.mindbox.mueblesalpes.negocio.exception.TarjetaCreditoNoExiste;
import com.mindbox.mueblesalpes.negocio.exception.TiendaException;
import com.mindbox.mueblesalpes.negocio.persistence.ListadoProductosLocal;
import com.mindbox.mueblesalpes.negocio.producto.IProductoService;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.ejb.Stateless;
import javax.jws.WebMethod;

/**
 *
 * @author Catalina
 */
@WebService()
@Stateless()
public class TiendaWebService implements ITiendaWebServices {

    @EJB
    private CarritoComprasLocal carritoService;
    @EJB
    private ClienteServiceLocal clienteService;
    @EJB
    private IProductoService productoService;
    @EJB
    private ListadoProductosLocal listadoProductoService;


    @Override
    @WebMethod(operationName = "comprarMueble")
    public RespuestaWS comprarMueble(
            @WebParam(name = "cliente") Cliente cliente,
            @WebParam(name = "usuario") Usuario usuario,
            @WebParam(name = "mueble") Mueble mueble,
            @WebParam(name = "entidad") Entidad entidad,
            @WebParam(name = "datosTarjeta") DatosTarjeta datosTarjeta) {
        return procesarCompra(cliente, usuario, mueble, entidad, datosTarjeta);
    }

    private RespuestaWS procesarCompra(Cliente cliente, Usuario usuario, Mueble mueble, Entidad entidad, DatosTarjeta datosTarjeta) {

        RespuestaWS res = new RespuestaWS();
        try {
            validarDatosEntrada(cliente, usuario, mueble, entidad, datosTarjeta);

            carritoService.setMuebleSeleccionado(mueble);
            carritoService.validarAgregarMuebleSeleccionado();
            carritoService.realizarVenta(cliente, usuario);
            carritoService.getVenta().setEntidad(entidad);
            carritoService.getVenta().setDatosTarjeta(datosTarjeta);
            carritoService.realizarPago();
            res.setEstado(0);
            res.setDescripcion("Venta creada: " + carritoService.getDescripcionVenta());
            carritoService.terminarTransaccion();

        } catch (TarjetaCreditoNoExiste ex) {
            Logger.getLogger(TiendaWebService.class.getName()).log(Level.SEVERE, null, ex);
            res.setEstado(1);
            res.setDescripcion(ex.getMessage());
        } catch (NoSePudoGrabarTarjetaCredito ex) {
            Logger.getLogger(TiendaWebService.class.getName()).log(Level.SEVERE, null, ex);
            res.setEstado(1);
            res.setDescripcion(ex.getMessage());
        } catch (MontoTarjetaInsuficiente ex) {
            Logger.getLogger(TiendaWebService.class.getName()).log(Level.SEVERE, null, ex);
            res.setEstado(1);
            res.setDescripcion(ex.getMessage());
        } catch (Exception ex) {
            Logger.getLogger(TiendaWebService.class.getName()).log(Level.SEVERE, null, ex);
            res.setEstado(1);
            res.setDescripcion("Se ha presentado un error inesperado:" + ex.getMessage());
        }
        return res;
    }

    private void validarDatosEntrada(Cliente cliente, Usuario usuario, Mueble mueble, Entidad entidad, DatosTarjeta datosTarjeta) {

        try {
            if (cliente == null) {
                throw new TiendaException("El cliente es nulo");
            }
            if (usuario == null) {
                throw new TiendaException("El usuario es nulo");
            }
            if (mueble == null) {
                throw new TiendaException("El mueble es nulo");
            }
            if (entidad == null) {
                throw new TiendaException("La entidad es nula");
            }
            Mueble m = productoService.consultarMueblePorId(mueble);
            if (m == null || m.getReferencia() == null) {
                throw new TiendaException("El mueble ingresado no existe");
            }
            if (clienteService.buscarUsuarioPorLogin(cliente.getUsuario()) == null) {
                throw new TiendaException("El usuario ingresado no existe");
            }
            if (clienteService.buscarClientePorId(cliente) == null) {
                throw new TiendaException("El cliente ingresado no existe");
            }
            if(listadoProductoService.buscarEntidadPorId(entidad) == null){
                throw new TiendaException("La entidad ingresada no existe");
            }
            if(entidad.getFormaPago() == null){
                throw new TiendaException("Debe indicar la forma de pago");
            }
        } catch (TiendaException ex) {
            throw ex;
        } catch (Exception ex) {
            throw new TiendaException("Error en validación de Datos");
        }

    }

    @Override
    @WebMethod(operationName = "crearCliente")
    public RespuestaWS crearCliente(@WebParam(name = "cliente") Cliente cliente) {
        RespuestaWS res = new RespuestaWS();
        try {
            if(cliente != null){
                if (clienteService.buscarUsuarioPorLogin(cliente.getUsuario()) != null) {
                    res.setEstado(1);
                    res.setDescripcion("El usuario ya existe");
                } else if(cliente.getUsuario().getUsuario() == null || cliente.getUsuario().getUsuario().trim().length() == 0){
                    res.setEstado(1);
                    res.setDescripcion("Debe ingrear el login");
                } else if(cliente.getUsuario().getPwd() == null || cliente.getUsuario().getPwd().trim().length() == 0){
                    res.setEstado(1);
                    res.setDescripcion("Debe ingrear la contraseña");
                } else if(cliente.getCiudadResidencia() == null || cliente.getCiudadResidencia().getIdCiudad() == null){
                    res.setEstado(1);
                    res.setDescripcion("Debe ingrear la ciudad");
                } else {
                    clienteService.crearCliente(cliente);
                    res.setEstado(0);
                    res.setDescripcion("Cliente creado exitosamente");
                }
            } else {
                res.setEstado(1);
                res.setDescripcion("El cliente es nulo");
            }
        } catch (TiendaException ex) {
            throw ex;
        }catch (Exception ex) {
            Logger.getLogger(TiendaWebService.class.getName()).log(Level.SEVERE, null, ex);
            res.setEstado(1);
            res.setDescripcion("Se ha presentado un error inesperado:" + ex.getMessage());
        }
        return res;
    }
}
